package Roteamento;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

/**
 * Classe que representa o vetor roteamento enviado entre nós quando o custo 
 * para um ou mais de seus enlaces muda
 * @author David, Iury, Milena
 *
 */
public class VetorRoteamento {

	HashMap<String, Integer> menoresCustos = new HashMap<String, Integer>();
	String fonte;
	private final int limiteDeInf = 100; 
	private final int seguranca = 95;
	
	/**
	 * Cria um novo vetor roteamento para um dado roteador
	 * @param fonte id do roteador.
	 */
	public VetorRoteamento(String fonte) {
		if(fonte.startsWith("#nome:")){
			CreateThisFromToString(fonte);
		} else {
			this.fonte = fonte;
		}
	}

	/**
	 * Manipula uma string para obter o id de um roteador
	 * @param input string com o id do roteador
	 */
	private void CreateThisFromToString(String input) {
		String[] array = input.split("#");
		this.fonte = array[1].split(":")[1];
		for(int i=2; i<array.length; i++){
			String[] destinoEValor = array[i].split(":");
			if (destinoEValor.length == 2) {
				this.updateDestino(destinoEValor[0], Integer.parseInt(destinoEValor[1]));
			}
		}
	}

	/**
	 * Atualiza o custo para, saindo deste roteador, chegar em um outro
	 * @param destino id do roteador destino
	 * @param custo novo custo
	 */
	public void updateDestino(String destino, int custo) {
		menoresCustos.put(destino, custo);
	}

	/**
	 * Lista de todos os nós alcançáveis a partir deste nó
	 * @return lista com os ids dos nós alcançáveis
	 */
	public List<String> getDestinosAlcancaveis() {
		List<String> returnList = new ArrayList<String>();
		for (String string : menoresCustos.keySet()) {
			returnList.add(string);
		}
		Collections.sort(returnList);
		return returnList;		
	}

	/**
	 * Descobre o menor custo da fonte para um dado roteador
	 * @param idDestino id do roteador destino
	 * @return o menor custo da fonte para o roteador idDestino
	 */
	public int getMenorCusto(String idDestino) {
		return menoresCustos.get(idDestino);
	}

	/**
	 * @return id do roteador fonte
	 */
	public String getFonte() {
		return fonte;
	}

	/**
	 * Atualiza os valores de todos os nós alcançáveis a partir do roteador fonte
	 * @param vetorRoteamento novos valores
	 */
	public void atualizaDestinosAlcancaveis(VetorRoteamento vetorRoteamento) {
		for (String destino : vetorRoteamento.getDestinosAlcancaveis()) {
			if (!this.getDestinosAlcancaveis().contains(destino)) {
				this.updateDestino(destino, limiteDeInf);
			}
		}
	}

	/**
	 * Remove dado roteador da lista de nós alcançáveis
	 * @param roteadorASerRemovido id do roteador a ser removido
	 */
	public void remove(String roteadorASerRemovido) {
		this.menoresCustos.remove(roteadorASerRemovido);
	}	
	
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	public String toString() {
		String stringRetorno = "#nome:" + getFonte() + "#";
		for (String desString : this.getDestinosAlcancaveis()) {
			stringRetorno = stringRetorno + desString + ":" + menoresCustos.get(desString) + "#";
		}
		return stringRetorno;
	}
	

}
